package com.taoyeshu.modules.sys.controller;

import java.util.ArrayList;
import java.util.Map;

import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.fastjson.JSONObject;
import com.taoyeshu.common.annotation.SystemControllerLog;
import com.taoyeshu.common.utils.PageResult;
import com.taoyeshu.common.web.BaseController;
import com.taoyeshu.modules.sys.entity.Role;
import com.taoyeshu.modules.sys.query.RoleQuery;
import com.taoyeshu.modules.sys.service.RoleService;

@Controller
@RequestMapping("/sys/role/")
public class RoleController extends BaseController {

	@Autowired
	private RoleService roleService;

	@ModelAttribute
	public void getRole(@RequestParam(value = "id", required = false) Integer id, Map<String, Object> map) {
		if (id != null) {
			map.put("role", roleService.getById(id));
		}
	}

	/**
	 * 
	 * @描述:列表试图
	 * @方法名称 :list
	 * @作者 :HuanGe
	 * @创建日期 :2015年10月5日 下午10:30:07
	 *
	 */
	@RequiresPermissions("sys:role:view")
	@RequestMapping("list")
	public String list() {
		return "modules/sys/role/list";
	}

	/**
	 * 
	 * @描述:列表数据
	 * @方法名称 :listData
	 * @作者 :HuanGe
	 * @创建日期 :2015年10月5日 下午10:30:19
	 * @param roleQuery
	 *
	 */
	@ResponseBody
	@RequiresPermissions("sys:role:view")
	@RequestMapping(value = "listData")
	@SystemControllerLog(description = "查看角色")
	public PageResult<Role> listData(RoleQuery roleQuery) {
		PageResult<Role> result = roleService.findPageResult(roleQuery);
		return result;
	}

	/**
	 * 
	 * @描述:新增角色视图
	 * @方法名称 :addView
	 * @作者 :HuanGe
	 * @创建日期 :2015年10月5日 下午10:30:31
	 *
	 */
	@RequiresPermissions("sys:role:add")
	@RequestMapping(value = "addView")
	public String addView() {
		return "modules/sys/role/add";
	}

	/**
	 * 
	 * @描述:新增角色
	 * @方法名称 :add
	 * @作者 :HuanGe
	 * @创建日期 :2015年10月5日 下午10:30:46
	 * @param role
	 *
	 */
	@ResponseBody
	@RequiresPermissions("sys:role:add")
	@RequestMapping(value = "add")
	@SystemControllerLog(description = "新增角色")
	public JSONObject add(Role role) {
		JSONObject json = new JSONObject();
		int id = roleService.save(role);
		if (id != 0) {
			json.put("code", 200);
			json.put("message", "success");
		} else {
			json.put("code", 999);
			json.put("message", "fail");
		}
		return json;
	}

	/**
	 * 
	 * @描述:修改角色视图
	 * @方法名称 :updateView
	 * @作者 :HuanGe
	 * @创建日期 :2015年10月5日 下午10:30:59
	 * @param role
	 * @param model
	 *
	 */
	@RequiresPermissions("sys:role:update")
	@RequestMapping(value = "updateView")
	public String updateView(Role role, Model model) {
		model.addAttribute("role", role);

		return "modules/sys/role/update";
	}

	/**
	 * 
	 * @描述:修改角色
	 * @方法名称 :update
	 * @作者 :HuanGe
	 * @创建日期 :2015年10月5日 下午10:31:17
	 * @param role
	 *
	 */
	@ResponseBody
	@RequiresPermissions("sys:role:update")
	@RequestMapping(value = "update")
	@SystemControllerLog(description = "修改角色")
	public JSONObject update(Role role) {
		JSONObject json = new JSONObject();
		try {
			roleService.update(role);
			json.put("code", 200);
			json.put("message", "success");
			return json;
		} catch (Exception e) {
			e.printStackTrace();
			json.put("code", 999);
			json.put("message", "fail");
			return json;
		}
	}

	/**
	 * 
	 * @描述:删除角色（假删除）
	 * @方法名称 :delete
	 * @作者 :HuanGe
	 * @创建日期 :2015年10月5日 下午10:31:28
	 * @param role
	 *
	 */
	@ResponseBody
	@RequiresPermissions("sys:role:delete")
	@RequestMapping(value = "delete")
	@SystemControllerLog(description = "删除角色")
	public JSONObject delete(Role role) {
		JSONObject json = new JSONObject();
		try {
			roleService.delete(role);
			json.put("code", 200);
			json.put("message", "success");
			return json;
		} catch (Exception e) {
			json.put("code", 999);
			json.put("message", "fail");
			return json;
		}
	}

	/**
	 * 
	 * @描述:分配资源权限视图
	 * @方法名称 :permissView
	 * @作者 :HuanGe
	 * @创建日期 :2015年10月5日 下午10:31:50
	 * @param model
	 * @param id
	 *
	 */
	@RequestMapping(value = "permissionView")
	@RequiresPermissions("sys:role:permission")
	public String permissView(Model model, Integer id) {
		model.addAttribute("roleId", id);
		return "modules/sys/role/permissions";
	}

	/**
	 * 
	 * @描述:分配权限
	 * @方法名称 :permission
	 * @作者 :HuanGe
	 * @创建日期 :2015年10月5日 下午10:32:05
	 * @param id
	 * @param resourcesIds
	 *
	 */
	@ResponseBody
	@RequestMapping(value = "permission")
	@RequiresPermissions("sys:role:permission")
	@SystemControllerLog(description = "分配权限")
	public JSONObject permission(Integer id, @RequestParam("resourcesIds[]") ArrayList<Integer> resourcesIds) {
		JSONObject jsonObject = new JSONObject();
		// 去除关联
		roleService.removeRRByRoleId(id);
		for (Integer resId : resourcesIds) {
			roleService.saveRR(id, resId);
		}
		return jsonObject;
	}
}
